function Observer() {

}

/**
  data：为对象的直接属性
  key: 为属性名
  val: 为属性引用

  1.Observer的主要职责是作为监听，利用Object.defineProperty()定义的get与set方法，递归监听对象中所有的属性，
  {1，递归 所操作的元素具有一致性，比如定义的data,与data的属性Book1就有一致性
    2.递归一定有一个出口 比如下面方法中的 if(data == null || typeof data != 'object')则return
  }
  2.observeProp方法传递data, key,val ,defineProperty中的set方法新值不为旧值是，则执行dep容器执行notify方法。
**/
var dep;

function observeProp(data, key, val) {
  addObserve(val)
  Object.defineProperty(data, key, {
    enumerable: true, //可枚举
    configurable: true, //可配置
    get: function() {
      if (Dep.target) {
        dep.addSub(Dep.target)
      }
      return val
    },
    set: function(newVal) {
      if (val == newVal) {
        return
      }
      val = newVal
      dep.notify();
      console.log('属性名为:' + key + '的值被更改为:' + newVal.toString())
    }
  });
}

function addObserve(data) {
  if (data == null || typeof data != 'object') {
    return
  }
  Object.keys(data).forEach(key => {
    observeProp(data, key, data[key])
  })
}

var data = {
  Book1: {
    name: ''
  },
  Book2: ''
}
addObserve(data)